import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import seaborn
import os ,sys 

Fs=48000 #信号的采样率
y = [] 
x = [] 

data=open('m.dat') 
idx = 0
cnt = 0
while True:
    mstr=data.readline()  #读取文件数据
    mstr=mstr.replace('\n','') #删除回车换行
    mstr=mstr.replace('\r','')
    mstr=mstr.replace(' ','') #删除空格
    if len(mstr) ==0:
        cnt =cnt+1
        if cnt > 10 :
            break 
        continue 
    # 更新绘图数据
    y.append(float(mstr))
    x.append(float(idx)) 
    idx +=1
    cnt=0

data.close()

yy=fft(y)                     #快速傅里叶变换
yreal = yy.real               # 获取实数部分
yimag = yy.imag               # 获取虚数部分

yf=abs(fft(y))                # 取模
yf1=abs(fft(y))/((len(x)/2))           #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性，只取一半区间

xf = np.arange(len(y)) *Fs / len(y)      # 频率
xf1 = xf
xf2 = xf[range(int(len(x)/2))]#取一半区间

#---------------------将数据写入文件---------------------------
#混合波的FFT（双边频率范围）
file=open("d1.txt","w")
file.write('#FFT-双边频率\n')
for i in range(len(yf1)):
    file.write(str(xf[i])+' '+str(yf[i])+'\n')
file.close()

#混合波的FFT（归一化后的双边频率范围）
file=open("d2.txt","w")
file.write('#FFT-双边归一化后的\n')
for i in range(len(yf1)):
    file.write(str(xf1[i])+' '+str(yf1[i])+'\n')
file.close()


#混合波的FFT（归一化后的单边频率范围）
file=open("d3.txt","w")
file.write('#FFT-单边归一化后的\n')
for i in range(len(yf2)):
    file.write(str(xf2[i])+' '+str(yf2[i])+'\n')
file.close()
#quit()
#-----------------------------------------------------

#----------------- python绘图 ------------------------
#原始波形
plt.subplot(221)
plt.plot(x,y)
plt.title('Original wave') 
#混合波的FFT（双边频率范围）
plt.subplot(222)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表
#混合波的FFT（归一化）
plt.subplot(223)
plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

plt.subplot(224)
plt.plot(xf2,yf2,'b') 
plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')


plt.show()